/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agentes;

import gradehorario.Comprador;
import gradehorario.Item;
import gradehorario.Lance;
import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.UnreadableException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author rafaelneri
 */
public class CompradorAgent extends Agent{
    
    private Comprador _comprador;
    
    public Comprador getComprador(){
        return this._comprador;
    }
    
    @Override
    protected void setup(){
        
        //criando o objeto comprador
        this._comprador = new Comprador(getAID().getName());
        
        //Registrando o comprador para participar de leiloes
        DFAgentDescription dfd = new DFAgentDescription();
        dfd.setName(getAID());
        ServiceDescription sd = new ServiceDescription();
        sd.setType("comprador-leilao");
        sd.setName("JADE-comprador-leilao");
        dfd.addServices(sd);
        
        try {
          DFService.register(this, dfd);
        }
        catch (FIPAException fe) {
          fe.printStackTrace();
        }
        
        //adicionando os comportamentos do comprador
        addBehaviour(new OfertarLanceRequest());
    }
    
    @Override
    protected void takeDown() {
        //Remove o agente das páginas amarelas
        try {
          DFService.deregister(this);
        }
        catch (FIPAException fe) {
          fe.printStackTrace();
        }
        
        //Mostra que o agente foi finalizado
        System.out.println("agente comprador "+getAID().getName()+" finalizado.");
      }
    
    protected class OfertarLanceRequest extends CyclicBehaviour{
        protected Lance _ultimoLance;
        protected int _qtdLances;
        
        /**
         *
         */
        @Override
        public void action(){
            ACLMessage msg = myAgent.receive();
            
            switch(msg.getPerformative()){
                case ACLMessage.CFP:
                    try {
                        ACLMessage msgAction = getProposeMessage(msg);
                        _ultimoLance = (Lance)msgAction.getContentObject();
                        myAgent.send(msgAction);
                    } catch (UnreadableException ex) {
                        Logger.getLogger(CompradorAgent.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    break;
                case ACLMessage.PROPOSE:
                    _qtdLances++;
                    try {
                        ACLMessage msgAction = getProposeMessage(msg);
                        _ultimoLance = (Lance)msgAction.getContentObject();
                        myAgent.send(msgAction);
                    } catch (UnreadableException ex) {
                        Logger.getLogger(CompradorAgent.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    break;
                case ACLMessage.ACCEPT_PROPOSAL:
                    try {
                        Item item = (Item)msg.getContentObject();
                        ((CompradorAgent)myAgent)._comprador.comprarItem(item);
                    } catch (UnreadableException ex) {
                        Logger.getLogger(CompradorAgent.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    break;
                case ACLMessage.REJECT_PROPOSAL:
                    try {
                        Item item = (Item)msg.getContentObject();
                        ((CompradorAgent)myAgent)._comprador.recusarItem(item);
                    } catch (UnreadableException ex) {
                        Logger.getLogger(CompradorAgent.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    break;
            }
        }
        
        private ACLMessage getProposeMessage(ACLMessage receivedMessage) throws UnreadableException{
            ACLMessage msgP;
            
            Item item = (Item)receivedMessage.getContentObject();
            Lance lance = ((CompradorAgent)myAgent).getComprador().ofertarLance(item);

            //verificar se o lance é nulo, ou seja representa uma desistência
            if(lance != null){
                msgP = new ACLMessage(ACLMessage.PROPOSE);
                msgP.addReceiver(receivedMessage.getSender());
                try {
                    msgP.setContentObject(lance);
                } catch (IOException ex) {
                    Logger.getLogger(CompradorAgent.class.getName()).log(Level.SEVERE, null, ex);
                }
                msgP.setConversationId("ofertar-lance");
            }else{
                msgP = new ACLMessage(ACLMessage.REFUSE);
                msgP.addReceiver(receivedMessage.getSender());
                msgP.setConversationId("recusar-lance");
            }
            
            return msgP;
        }
    }
    
}
